//! # 消息总线日志演示
//!
//! 演示消息总线系统的详细日志记录功能

use rustcloud_bus::{
    memory::InMemoryMessageBus, 
    message::Message, 
    bus::MessageBus,
    event::{Event, EventType, EventContext, EventBus},
    event_bus::MessageBusEventBus
};
use serde_json::json;
use std::sync::Arc;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化日志
    tracing_subscriber::registry()
        .with(tracing_subscriber::fmt::layer().with_target(false))
        .with(EnvFilter::from_default_env().add_directive("rustcloud_bus=debug".parse()?))
        .init();

    println!("🚀 消息总线增强日志演示开始\n");

    // 1. 创建消息总线
    println!("=== 1. 创建消息总线 ===");
    let bus = Arc::new(InMemoryMessageBus::new().await?);
    
    // 2. 创建订阅者
    println!("\n=== 2. 创建订阅者 ===");
    let subscriber1 = bus.subscribe("user.events.*").await?;
    let subscriber2 = bus.subscribe("order.events.*").await?;
    let subscriber3 = bus.subscribe("**").await?; // 订阅所有消息
    
    // 3. 发布消息
    println!("\n=== 3. 发布消息 ===");
    
    let message1 = Message::new("user.events.created", json!({
        "user_id": "user123",
        "username": "alice",
        "email": "alice@example.com"
    }));
    bus.publish(message1).await?;
    
    let message2 = Message::new("order.events.placed", json!({
        "order_id": "order456", 
        "user_id": "user123",
        "amount": 99.99,
        "items": ["item1", "item2"]
    }));
    bus.publish(message2).await?;
    
    // 4. 事件总线演示
    println!("\n=== 4. 事件总线演示 ===");
    let event_bus = Arc::new(MessageBusEventBus::new(bus.clone()).await?);
    
    let context = EventContext::new("demo-service".to_string())
        .with_user_id("user123".to_string());
    
    let event = Event::new(
        "user.registered".to_string(),
        EventType::Domain,
        json!({"user_id": "user123", "timestamp": "2024-01-01T00:00:00Z"}),
        context,
    );
    
    event_bus.publish_event(event).await?;
    
    // 5. 尝试发布大消息（会触发错误日志）
    println!("\n=== 5. 大消息处理演示 ===");
    let large_data = "x".repeat(2_000_000); // 2MB 消息，超过默认限制
    let large_message = Message::new("test.large", json!({"data": large_data}));
    
    if let Err(e) = bus.publish(large_message).await {
        println!("预期的错误（消息过大）: {}", e);
    }
    
    // 6. 查看统计信息
    println!("\n=== 6. 消息总线统计信息 ===");
    let stats = bus.stats().await?;
    println!("📊 统计信息:");
    println!("  • 已发布消息: {}", stats.total_published);
    println!("  • 已接收消息: {}", stats.total_received);
    println!("  • 失败消息: {}", stats.total_failed);
    println!("  • 活跃订阅者: {}", stats.active_subscribers);
    println!("  • 运行时间: {}秒", stats.uptime_seconds);
    println!("  • 消息/秒: {:.2}", stats.messages_per_second);
    
    // 7. 关闭消息总线
    println!("\n=== 7. 关闭消息总线 ===");
    bus.close().await?;
    
    println!("\n✅ 日志演示完成！");
    println!("\n💡 要查看详细日志，请设置环境变量:");
    println!("   RUST_LOG=debug cargo run --example logging_demo");
    
    Ok(())
}